/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vista.personas.pacientes;

import prolog.GestorPrologPaciente;
import geografia.GestorVistaLocalidadIntFrm;
import geografia.Localidad;
import java.util.Date;
import java.util.List;
import javax.swing.JDialog;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;
import modelo.personas.Domicilio;
import modelo.personas.pacientes.GestorPaciente;
import modelo.personas.pacientes.Paciente;
import util.GestorComponenteVista;
import vista.GestorVistaEditor;


/**
 *
 * @author Raul
 */
public class GestorVistaPacienteDlg extends GestorVistaEditor {
    
    private EditorPacienteDlg formulario;
    private GestorPaciente gestorModelo = new GestorPaciente();
    private GestorTablaParientes gestorTabla;

    /**Gestiona un formulario para creacion
     * 
     */
    public GestorVistaPacienteDlg() {
        gestorModelo.crearModelo();
        setModo(CREACION);
    }

    /**Gestiona un formulario para modificacion
     * 
     * @param modelo la entidad que se va a modificar
     */
    public GestorVistaPacienteDlg(Paciente modelo) {
        gestorModelo.setModelo(modelo);
        setModo(MODIFICACION);
    }

    @Override
    public EditorPacienteDlg getFormulario() {
        return formulario;
    }

    public void setFormulario(EditorPacienteDlg formulario) {
        this.formulario = formulario;
    }

    @Override
    public GestorPaciente getGestorModelo() {
        return gestorModelo;
    }

    public void setGestorModelo(GestorPaciente gestorModelo) {
        this.gestorModelo = gestorModelo;
    }

    @Override
    public String getNombreObjeto() {
        return "El Paciente";
    }

    @Override
    public void abrirFormulario(){
        setFormulario(new EditorPacienteDlg( this));
        gestorTabla = new GestorTablaParientes(gestorModelo, formulario);
        inicializarVista();
        formulario.setVisible(true);
    }

    public Object nuevoTelefono(String codArea, int nroTelefono) {
        return gestorModelo.nuevoTelefono(codArea,nroTelefono);
    }

    @Override
    public void inicializarVista() {
        getFormulario().getParientesABMPnl().setGestorVista(gestorTabla);
        getFormulario().cargarComboProvincia(gestorModelo.listarProvincias());
        if(!super.isCreacion()) setearVistaConModelo();
    }
    
    public void cargarLocalidades(Object provincia){
        getFormulario().cargarComboLocalidad(gestorModelo.buscarLocalidad(provincia.toString()));
    }
    
    private void setearLocalidadEnVista(Localidad localidad){
        getFormulario().getCodigoPostalTxt().setValue(localidad.getCodigoPostal());
        getFormulario().getProvinciaCmb().setSelectedItem(localidad.getProvincia());
        getFormulario().getLocalidadCmb().setSelectedItem(localidad);
    }
    
    private void setearDomicilioEnVista(Domicilio domicilio){
        getFormulario().getCalleTxt().setText(domicilio.getCalle());
        getFormulario().getAlturaTxt().setValue(domicilio.getAltura());
        getFormulario().getBarrioTxt().setText(domicilio.getBarrio());
        getFormulario().getPisoTxt().setValue(domicilio.getPiso());
        getFormulario().getDepartamentoTxt().setText(domicilio.getDepartamento());
        setearLocalidadEnVista(domicilio.getLocalidad());
        
    }

    public void crearLocalidad() {
        final GestorVistaLocalidadIntFrm gest = new GestorVistaLocalidadIntFrm();
        gest.abrirFormulario();
        final JDialog form = new JDialog(getFormulario(), "Nueva Localidad", true);
        form.add(gest.getFormulario());
        form.pack();
        form.setLocationRelativeTo(null);
        gest.getFormulario().addInternalFrameListener(new InternalFrameAdapter() {
            @Override
            public void internalFrameClosed(InternalFrameEvent e) {
                form.dispose();
                setearLocalidadEnVista(gest.getGestorModelo().getModelo());
            }
        });
        form.setVisible(true);
    }
    
    @Override
    public void setearModeloConVista(){
        Paciente modelo = getGestorModelo().getModelo();
        modelo.setNombre(formulario.getNombreTxt().getText());
        modelo.setApellido(formulario.getApellidoTxt().getText());
        modelo.setSexo(formulario.getSexoCmb().getSelectedItem().toString());
        modelo.setFechaNacimiento(formulario.getFechaNacimientoDat().getDate());
        modelo.setEmail(getFormulario().getEmailTxt().getText());
        getGestorModelo().setDomicilio(getFormulario().getCalleTxt().getText(),
                getFormulario().getAlturaTxt().getValue(),
                getFormulario().getPisoTxt().getValue(),
                getFormulario().getDepartamentoTxt().getText(),
                getFormulario().getBarrioTxt().getText(),
                (Localidad) getFormulario().getLocalidadCmb().getSelectedItem());
        getGestorModelo().setDocumento(formulario.getTipoDniCmb().getSelectedItem().toString(),
                formulario.getNroDniTxt().getValue());
        getGestorModelo().agregarTelefonos(
                GestorComponenteVista.getObjetosEnLista(getFormulario().getTelefonosLst()));
        if (super.isCreacion()) modelo.setFechaAlta(new Date());
    }

    @Override
    public void setearVistaConModelo() {
        Paciente modelo = getGestorModelo().getModelo();
        getFormulario().getNroHistoriaClinicaTxt().setText(modelo.getHistoriaClinica().getNumero().toString());
        getFormulario().getNombreTxt().setText(modelo.getNombre());
        getFormulario().getApellidoTxt().setText(modelo.getApellido());
        getFormulario().getSexoCmb().setSelectedItem(modelo.getSexo());
        getFormulario().getFechaNacimientoDat().setDate(modelo.getFechaNacimiento());
        getFormulario().getEmailTxt().setText(modelo.getEmail());
        this.setearDomicilioEnVista(modelo.getDomicilios().iterator().next());
        getFormulario().getTipoDniCmb().setSelectedItem(modelo.getDocumento().getTipo());
        getFormulario().getNroDniTxt().setValue(modelo.getDocumento().getNumero());
        getFormulario().cargarListaTelefonos(modelo.getTelefonos());
    }

    void buscarLocalidad(Integer codigoPostal) {
        List<Localidad> localidades = gestorModelo.buscarLocalidad(codigoPostal);
        if (!localidades.isEmpty()) {
            setearLocalidadEnVista(localidades.get(0));
        }
    }

    @Override
    public void cerrarFormulario() {
        getFormulario().dispose();
    }

    void verParientes() {
        gestorTabla.cargarParientes();
    }

    void deshacer() {
        if (!isCreacion()) gestorModelo.eliminarParientesNoGuardados();
    }

    @Override
    public void accionPostGuardado() {
        Runnable runnable = new Runnable() {

            @Override
            public void run() {
                GestorPrologPaciente gpp = new GestorPrologPaciente();
                gpp.actualizarInfoPaciente(gestorModelo.getModelo());
                System.out.println("Base de conocimiento actualizada");
            }
        };
        
        (new Thread(runnable)).start();
    }        

}
